'use strict';

const Controller = require('egg').Controller;
const formidable = require('formidable');
const { Prefix, Post, Get, Delete } = require('egg-shell-decorators');
/**
 * @Controller 文件管理
 */
@Prefix('/api/v1/file')
class FileController extends Controller {
  /**
   * @summary 文件上传、更新
   * @description
   * @router post /api/v1/file/saveFile
   * @request formData file templateFile* 模板文件；grf后缀
   * @request formData file jsonFile 模板JSON数据文件；json后缀
   * @request query string _id 更新模板项ID（更新版本时必传）
   * @request query string classifyId* 分类ID
   * @request query string templateDescribe* 模板描述
   * @request query string templateName* 模板名称
   * @request query string remark 备注
   * @response 200 baseResponse
   */
  @Post('/saveFile')
  async saveFileHandle() {
    const { ctx, service, app } = this;
    const rules = {
      _id: { type: 'string', required: false },
      classifyId: { type: 'string', required: true },
      templateDescribe: { type: 'string', required: true },
      templateName: { type: 'string', required: true },
      remark: { type: 'string', required: false },
    };
    const valiErrors = app.validator.validate(rules, ctx.request.query);
    // 参数校验未通过
    if (valiErrors) {
      ctx.helper.fail({ ctx, code: 422, res: valiErrors });
      return;
    }
    try {
      await service.file.saveFileHandle();
    } catch (error) {
      ctx.helper.fail({
        ctx,
        code: 500,
        res: '后端接口异常！',
        detailMessage: error,
      });
    }
  }
  /**
   * @summary 文件恢复版本（指定最新版本）
   * @description
   * @router post /api/v1/file/switchVersion
   * @request body FileSwitchVersionDTO
   * @response 200 baseResponse
   */
  @Post('/switchVersion')
  async switchVersion() {
    const { ctx, service, app } = this;
    const valiErrors = app.validator.validate(
      ctx.rule.FileSwitchVersionDTO,
      ctx.request.body
    );
    // 参数校验未通过
    if (valiErrors) {
      ctx.helper.fail({ ctx, code: 422, res: valiErrors });
      return;
    }
    try {
      await service.file.switchVersion();
    } catch (error) {
      ctx.helper.fail({
        ctx,
        code: 500,
        res: '后端接口异常！',
        detailMessage: error,
      });
    }
  }
  //
  //    * @summary 文件上传（多个）
  //    * @description
  //    * @router post /api/v1/file/upload
  //    * @request formData file templateFile* 模板文件grf后缀
  //    * @request formData file jsonFile 数据文件json后缀
  //    * @request query string classifyId* 分类ID
  //    * @response 200 UploadFileDTO 创建成功（DTO）
  //
  @Post('/upload')
  async uploadFile() {
    const { ctx, service, app } = this;
    // 定义参数校验规则
    const rules = {
      classifyId: { type: 'string', required: true },
    };
    const valiErrors = app.validator.validate(rules, ctx.request.query);
    // 参数校验未通过
    if (valiErrors) {
      ctx.helper.fail({ ctx, code: 422, res: valiErrors });
      return;
    }
    try {
      await service.file.uploadFile();
    } catch (error) {
      ctx.helper.fail({
        ctx,
        code: 500,
        res: '后端接口异常！',
        detailMessage: error,
      });
    }
  }
  //
  //    * @summary 文件上传后提交保存
  //    * @description
  //    * @router post /api/v1/file/save
  //    * @request body FileSaveDTO
  //    * @response 200 baseResponse
  //
  @Post('/save')
  async saveFile() {
    const { ctx, service, app } = this;
    // 定义参数校验规则
    const valiErrors = app.validator.validate(
      ctx.rule.FileSaveDTO,
      ctx.request.body
    );
    // 参数校验未通过
    if (valiErrors) {
      ctx.helper.fail({ ctx, code: 422, res: valiErrors });
      return;
    }
    try {
      await service.file.saveFile();
    } catch (error) {
      ctx.helper.fail({
        ctx,
        code: 500,
        res: '后端接口异常！',
        detailMessage: error,
      });
    }
  }
  //   **
  //    * @summary 分页模板查询
  //    * @description
  //    * @router get /api/v1/file/page
  //    * @request query string classifyId 分类id
  //    * @request query string keyword 文件ID精准匹配；文件名称、文件描述模糊匹配
  //    * @request query string limit* 每页条数
  //    * @request query string page* 当前页
  //    * @response 200 FindFilePageDTO
  //    *
  //   @Get('/page')
  //   async findFilePage() {
  //     const { ctx, service, app } = this;
  //     const rules = {
  //       classifyId: { type: 'string', required: false },
  //       page: { type: 'string', required: true },
  //       limit: { type: 'string', required: true },
  //       keyword: { type: 'string', required: false },
  //     };
  //     // 定义参数校验规则
  //     const valiErrors = app.validator.validate(rules, ctx.request.query);
  //     // 参数校验未通过
  //     if (valiErrors) {
  //       ctx.helper.fail({ ctx, code: 422, res: valiErrors });
  //       return;
  //     }
  //     try {
  //       await service.file.findFilePage();
  //     } catch (error) {
  //       ctx.helper.fail({
  //         ctx,
  //         code: 500,
  //         res: '后端接口异常！',
  //         detailMessage: error,
  //       });
  //     }
  //   }
  /**
   * @summary 文件分页查询
   * @description
   * @router post /api/v1/file/page
   * @request formData string page 当前页
   * @request formData string rows 每页条数
   * @request formData string sort 排序字段
   * @request formData string order 排序规则
   * @request formData string pageFlag 是否分页
   * @request formData string onlyCountFlag 是否统计总数
   * @request formData string filtersRaw 过滤条件
   * @request formData string sortersRaw
   * @request formData string paramsRaw
   * @response 200 FindFilePageDTO
   */
  @Post('/page')
  async findFilePages() {
    const { ctx, service, app } = this;
    const rules = {
      page: { type: 'string', required: false },
      rows: { type: 'string', required: false },
      sort: { type: 'string', required: false },
      pageFlag: { type: 'string', required: false },
      onlyCountFlag: { type: 'string', required: false },
      filtersRaw: { type: 'string', required: false },
      sortersRaw: { type: 'string', required: false },
      paramsRaw: { type: 'string', required: false },
    };
    // 获取formData数据
    function parse(req) {
      const form = new formidable.IncomingForm();
      return new Promise((resolve, reject) => {
        form.parse(req, (err, fields, files) => {
          resolve({ fields, files });
        });
      });
    }
    const extraParams = await parse(this.ctx.req);
    // 定义参数校验规则
    const valiErrors = app.validator.validate(rules, extraParams.fields);
    // 参数校验未通过
    if (valiErrors) {
      ctx.helper.fail({ ctx, code: 422, res: valiErrors });
      return;
    }
    try {
      await service.file.findFilePages(extraParams.fields);
    } catch (error) {
      ctx.helper.fail({
        ctx,
        code: 500,
        res: '后端接口异常！',
        detailMessage: error,
      });
    }
  }
  /**
   * @summary 下载文件
   * @description
   * @router post /api/v1/file/download
   * @request query string fileId* 文件id
   * @request query string versionNo 文件版本号（不传默认获取最新版）
   * @request query string fileType 文件类型（传json获取json后缀文件;不传默认获取grf后缀的模板文件）
   * @response 200  OK
   */
  @Post('/download')
  async findFileDownload() {
    const { ctx, service, app } = this;
    const rules = {
      fileId: { type: 'string', required: true },
      versionNo: { type: 'string', required: false },
      fileType: { type: 'string', required: false },
    };
    // 定义参数校验规则
    const valiErrors = app.validator.validate(rules, ctx.request.query);
    // 参数校验未通过
    if (valiErrors) {
      ctx.helper.fail({ ctx, code: 422, res: valiErrors });
      return;
    }
    try {
      await service.file.findFileDownload();
    } catch (error) {
      ctx.helper.fail({
        ctx,
        code: 500,
        res: '后端接口异常！',
        detailMessage: error,
      });
    }
  }
  /**
   * @summary 文件版本删除
   * @description
   * @router delete /api/v1/file/delete
   * @request body FileDeleteDto
   * @response 200 baseResponse
   */
  @Delete('/delete')
  async deleteFileHandle() {
    const { ctx, service, app } = this;
    // 定义参数校验规则
    const valiErrors = app.validator.validate(
      ctx.rule.FileDeleteDto,
      ctx.request.body
    );
    // 参数校验未通过
    if (valiErrors) {
      ctx.helper.fail({ ctx, code: 422, res: valiErrors });
      return;
    }
    try {
      await service.file.deleteFileHandle();
    } catch (error) {
      ctx.helper.fail({
        ctx,
        code: 500,
        res: '后端接口异常！',
        detailMessage: error,
      });
    }
  }
  //
  //    * @summary 文件更新版本
  //    * @description
  //    * @router post /api/v1/file/update
  //    * @request body FileUpdateDTO
  //    * @response 200 baseResponse
  //
  //   @Post('/update')
  //   async updateFile() {
  //     const { ctx, service, app } = this;
  //     // 定义参数校验规则
  //     const valiErrors = app.validator.validate(
  //       ctx.rule.FileSaveDTO,
  //       ctx.request.body
  //     );
  //     // 参数校验未通过
  //     if (valiErrors) {
  //       ctx.helper.fail({ ctx, code: 422, res: valiErrors });
  //       return;
  //     }
  //     try {
  //       await service.file.updateFile();
  //     } catch (error) {
  //       ctx.helper.fail({
  //         ctx,
  //         code: 500,
  //         res: '后端接口异常！',
  //         detailMessage: error,
  //       });
  //     }
  //   }
}

module.exports = FileController;
